import type { PlatformTypeValue } from '../../../../types/interfaces'

export enum ExtractPositionType {
  Prefix = 'prefix',
  Suffix = 'suffix',
  Full = 'full',
}

export interface QuoteNavigationConfig {
  selector: string
  userName: string
  userUrl: string
  content: string
  postTime: string
  quoteBlock: string
  sequenceInsert: string
}
export type QuoteNavigationPlatformConfig = Partial<Record<PlatformTypeValue, Record<string, QuoteNavigationConfig>>>

export interface ContentHashes {
  fullHash: string
  prefixHash: string
  suffixHash: string
}

export interface UserCommentInfo {
  id: string
  floorNumber: number
  timestamp: string
  element: JQuery<HTMLElement>
}

export interface UserCommentSequence {
  username: string
  userId: string // 用户唯一标识
  comments: UserCommentInfo[] // 按时间排序的用户评论
  commentCount: number
  firstCommentTime: string
  lastCommentTime: string
  commentIds: string[] // 按时间排序的评论 ID 数组
}

export interface QuoteNavigationUserInfo {
  name: string
  id: string
}

export interface UserCommentNavigation {
  previousCommentId?: string // 同一用户上一条评论ID
  nextCommentId?: string // 同一用户下一条评论ID
  userCommentIndex: number // 在用户评论列表中的位置（1-based）
  userCommentCount: number // 用户总评论数
  isFirstUserComment: boolean // 是否是用户的第一条评论
  isLastUserComment: boolean // 是否是用户的最后一条评论
  userSequencePosition: string // 格式化位置信息，如 "2/5"
}

export interface CommentInfo {
  id: string
  floorNumber: number
  user: QuoteNavigationUserInfo
  element: JQuery<HTMLElement>
  content: string
  contentHash: string
  prefixHash: string
  suffixHash: string
  timestamp: string
  quoteTargets: string[] // 被引用的评论 ID
  quotedBy: string[] // 引用此评论的评论 ID
  hasUnmatchedQuotes: boolean // 标识是否存在未匹配的引用块
  unmatchedQuoteCount: number // 未匹配引用块的数量
  unmatchedQuotePreviews: string[] // 未匹配引用块的预览文本
  matchTypes: {
    exact: string[] // 精确匹配的评论 ID
    fuzzy: string[] // 模糊匹配的评论 ID
    prefixSuffix: string[] // 前后缀匹配的评论 ID
  }
  userNavigation?: UserCommentNavigation // 用户内导航信息
}

export interface ExtractContentOptions {
  type: ExtractPositionType
  maxLength?: number
}
